GtkScrolledWindow: Take border into account
authorMatthias Clasen <mclasen@redhat.com>
Fri, 28 Nov 2014 22:20:23 +0000 (17:20 -0500)
committerMatthias Clasen <mclasen@redhat.com>
Wed, 10 Dec 2014 15:01:30 +0000 (10:01 -0500)
Use the new scrollable API for getting non-scrollable borders
and draw over/undershoot at the right place. In practice, this
means that they now appear below treeview headers.

gtk/gtkscrolledwindow.c

index c2b3ecbfc1a5f86ec17b61130b0639f2467e6b72..1365eb648bc8aa73d7001881c71152b92e427689 100644 (file)
@@ -1765,6 +1765,26 @@ gtk_scrolled_window_draw_scrollbars_junction (GtkScrolledWindow *scrolled_window
   gtk_style_context_restore (context);
 }
 
+static void
+gtk_scrolled_window_inner_allocation (GtkWidget     *widget,
+                                      GtkAllocation *rect)
+{
+  GtkWidget *child;
+  GtkBorder border = { 0 };
+
+  gtk_scrolled_window_relative_allocation (widget, rect);
+
+  child = gtk_bin_get_child (GTK_BIN (widget));
+  if (GTK_IS_SCROLLABLE (child) &&
+      gtk_scrollable_get_border (GTK_SCROLLABLE (child), &border))
+    {
+      rect->x += border.left;
+      rect->y += border.top;
+      rect->width -= border.left + border.right;
+      rect->height -= border.top + border.bottom;
+    }
+}
+
 static void
 gtk_scrolled_window_draw_overshoot (GtkScrolledWindow *scrolled_window,
                                    cairo_t           *cr)
@@ -1778,7 +1798,8 @@ gtk_scrolled_window_draw_overshoot (GtkScrolledWindow *scrolled_window,
     return;
 
   context = gtk_widget_get_style_context (widget);
-  gtk_scrolled_window_relative_allocation (widget, &rect);
+  gtk_scrolled_window_inner_allocation (widget, &rect);
+
   overshoot_x = CLAMP (overshoot_x, - MAX_OVERSHOOT_DISTANCE, MAX_OVERSHOOT_DISTANCE);
   overshoot_y = CLAMP (overshoot_y, - MAX_OVERSHOOT_DISTANCE, MAX_OVERSHOOT_DISTANCE);
 
@@ -1836,7 +1857,7 @@ gtk_scrolled_window_draw_undershoot (GtkScrolledWindow *scrolled_window,
   GtkAdjustment *adj;
 
   context = gtk_widget_get_style_context (widget);
-  gtk_scrolled_window_relative_allocation (widget, &rect);
+  gtk_scrolled_window_inner_allocation (widget, &rect);
 
   gtk_style_context_save (context);
   gtk_style_context_remove_class (context, GTK_STYLE_CLASS_FRAME);